【Python】PIL库中图像的mode参数 | 您所在的位置:网站首页 › 韩国make mode图片 › 【Python】PIL库中图像的mode参数 |
目录 这篇的是为了说明PIL库中图像的mode参数。 部分结果见下 部分代码和结果 最后一点关于颜色模式的,供备注用 重点关注P模式 获取实际图片的调色板 如果不想知道一一对应,只是想知道有哪些颜色,可以使用如下代码 如何将灰度图像保存为P模式的图像呢? 这篇的是为了说明PIL库中图像的mode参数。我做的事情是: 在本地找了jpg的图,convert为不同mode,将不同的图截取做了个脑图,有个直观的感觉吧。把不同mode的图通过np.array()转化为array, 打印出array的shape, 和array[0, 0]的值, 便于理解不同mode的通道和像素值的存储。 部分结果见下如果你已经了解RGB模式的含义,那么你需要的只是一个利用“重映射”组织数据的思想。 以一个简单的3×3数组为例,比如这样的 A = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]它可以被我们视为一张极其简单的图片。假设其中每个元素都是6比特无符号整数类型(虽然实际没有6bit的数据类型,但作为理论分析还是有意义的,可表示0~63),用来表示颜色(至于表示什么颜色就随意了,我们这里只做一个假想的概念),那么数组A理论占用的空间就是9×6=54比特。具体地,考虑一个非全零的A, A = [[18, 21, 0], [ 0, 35, 35], [ 0, 35, 18]]这并不影响它占用的空间大小。但我们很容易发现,这个数组中实际出现的数字其实并不多,只有0、18、21、35这几个而已。如果我们建立一个映射关系 0 → 0 1 → 18 2 → 21 3 → 35上面的数组就可以重写为 B = [[1, 2, 0], [0, 3, 3], [0, 3, 1]]哎你会发现这样的表示紧凑了很多。而0123只需要两个比特就能表示,数组B占用的空间可以压缩到9×2=18比特,是原来的1/3。即使把这套映射关系也保存下来,即存成一个新的一维数组 c = [0, 18, 21, 35]元素的位置即代表了它的映射值。向量c的占用为4×6=24比特,跟数组B的加起来也才不过42bit。而且你可以很容易想见,如果数组A的规模十分巨大,而实际出现的数据还是这么几个,这种重映射后的表示法优势就非常明显。 在Python中numpy库的体系下,通过语句c[B],就可以重建数组A。总结起来,对于元素数据长度特别大,但实际出现的数据去重后数量非常少的情况,我们完全可以把这些弥散在很大范围内的数据,重映射到一个更为紧凑的范围内(上面就是将弥散在几十范围内的数据映射到了小于4的几个值上),从而实现以小见大的效果。 具体到PIL图片的P模式,跟这个原理就非常类似了,它是把原来单像素占用24(32)个bit的RGB(A)真彩图片中的像素值,重映射到了8bit长,即0~255的数值范围内。而这套映射关系,就是属于这张图的所谓“调色板”(Pallete)。当然,一张图片里实际出现的颜色很可能远不止256种,这时只需要按照一种合适的取舍规则,把一些相近的颜色合并成一种就好了。不过这样就有可能带来一定的失真。如何根据具体的图片尽可能少失真地合并颜色,就是另一个话题了。 现在,你应该可以理解P模式的含义了。更重要的是,这种重映射的组织数据的思想,远不止在图像处理领域适用。 获取实际图片的调色板 from PIL import Image import numpy as np img = Image.open(r"F:\data\VOC\VOCdevkit\VOC2012\SegmentationClass\2007_000250.png") img_arr = np.array(img) unique_value = np.unique(img_arr) palette = np.array(img.getpalette(),dtype=np.uint8).reshape((256,3)) print(unique_value) print(palette)其中unique_value为 array([ 0, 5, 11, 255], dtype=uint8) 其中palette的值为 array([[ 0, 0, 0], [128, 0, 0], [ 0, 128, 0], [128, 128, 0], [ 0, 0, 128], [128, 0, 128], [ 0, 128, 128], [128, 128, 128], [ 64, 0, 0], [192, 0, 0], [ 64, 128, 0], [192, 128, 0], [ 64, 0, 128], [192, 0, 128], [ 64, 128, 128], [192, 128, 128], [ 0, 64, 0], [128, 64, 0], [ 0, 192, 0], [128, 192, 0], [ 0, 64, 128], [128, 64, 128], [ 0, 192, 128], [128, 192, 128], [ 64, 64, 0], [192, 64, 0], [ 64, 192, 0], [192, 192, 0], [ 64, 64, 128], [192, 64, 128], [ 64, 192, 128], [192, 192, 128], [ 0, 0, 64], [128, 0, 64], [ 0, 128, 64], [128, 128, 64], [ 0, 0, 192], [128, 0, 192], [ 0, 128, 192], [128, 128, 192], [ 64, 0, 64], [192, 0, 64], [ 64, 128, 64], [192, 128, 64], [ 64, 0, 192], [192, 0, 192], [ 64, 128, 192], [192, 128, 192], [ 0, 64, 64], [128, 64, 64], [ 0, 192, 64], [128, 192, 64], [ 0, 64, 192], [128, 64, 192], [ 0, 192, 192], [128, 192, 192], [ 64, 64, 64], [192, 64, 64], [ 64, 192, 64], [192, 192, 64], [ 64, 64, 192], [192, 64, 192], [ 64, 192, 192], [192, 192, 192], [ 32, 0, 0], [160, 0, 0], [ 32, 128, 0], [160, 128, 0], [ 32, 0, 128], [160, 0, 128], [ 32, 128, 128], [160, 128, 128], [ 96, 0, 0], [224, 0, 0], [ 96, 128, 0], [224, 128, 0], [ 96, 0, 128], [224, 0, 128], [ 96, 128, 128], [224, 128, 128], [ 32, 64, 0], [160, 64, 0], [ 32, 192, 0], [160, 192, 0], [ 32, 64, 128], [160, 64, 128], [ 32, 192, 128], [160, 192, 128], [ 96, 64, 0], [224, 64, 0], [ 96, 192, 0], [224, 192, 0], [ 96, 64, 128], [224, 64, 128], [ 96, 192, 128], [224, 192, 128], [ 32, 0, 64], [160, 0, 64], [ 32, 128, 64], [160, 128, 64], [ 32, 0, 192], [160, 0, 192], [ 32, 128, 192], [160, 128, 192], [ 96, 0, 64], [224, 0, 64], [ 96, 128, 64], [224, 128, 64], [ 96, 0, 192], [224, 0, 192], [ 96, 128, 192], [224, 128, 192], [ 32, 64, 64], [160, 64, 64], [ 32, 192, 64], [160, 192, 64], [ 32, 64, 192], [160, 64, 192], [ 32, 192, 192], [160, 192, 192], [ 96, 64, 64], [224, 64, 64], [ 96, 192, 64], [224, 192, 64], [ 96, 64, 192], [224, 64, 192], [ 96, 192, 192], [224, 192, 192], [ 0, 32, 0], [128, 32, 0], [ 0, 160, 0], [128, 160, 0], [ 0, 32, 128], [128, 32, 128], [ 0, 160, 128], [128, 160, 128], [ 64, 32, 0], [192, 32, 0], [ 64, 160, 0], [192, 160, 0], [ 64, 32, 128], [192, 32, 128], [ 64, 160, 128], [192, 160, 128], [ 0, 96, 0], [128, 96, 0], [ 0, 224, 0], [128, 224, 0], [ 0, 96, 128], [128, 96, 128], [ 0, 224, 128], [128, 224, 128], [ 64, 96, 0], [192, 96, 0], [ 64, 224, 0], [192, 224, 0], [ 64, 96, 128], [192, 96, 128], [ 64, 224, 128], [192, 224, 128], [ 0, 32, 64], [128, 32, 64], [ 0, 160, 64], [128, 160, 64], [ 0, 32, 192], [128, 32, 192], [ 0, 160, 192], [128, 160, 192], [ 64, 32, 64], [192, 32, 64], [ 64, 160, 64], [192, 160, 64], [ 64, 32, 192], [192, 32, 192], [ 64, 160, 192], [192, 160, 192], [ 0, 96, 64], [128, 96, 64], [ 0, 224, 64], [128, 224, 64], [ 0, 96, 192], [128, 96, 192], [ 0, 224, 192], [128, 224, 192], [ 64, 96, 64], [192, 96, 64], [ 64, 224, 64], [192, 224, 64], [ 64, 96, 192], [192, 96, 192], [ 64, 224, 192], [192, 224, 192], [ 32, 32, 0], [160, 32, 0], [ 32, 160, 0], [160, 160, 0], [ 32, 32, 128], [160, 32, 128], [ 32, 160, 128], [160, 160, 128], [ 96, 32, 0], [224, 32, 0], [ 96, 160, 0], [224, 160, 0], [ 96, 32, 128], [224, 32, 128], [ 96, 160, 128], [224, 160, 128], [ 32, 96, 0], [160, 96, 0], [ 32, 224, 0], [160, 224, 0], [ 32, 96, 128], [160, 96, 128], [ 32, 224, 128], [160, 224, 128], [ 96, 96, 0], [224, 96, 0], [ 96, 224, 0], [224, 224, 0], [ 96, 96, 128], [224, 96, 128], [ 96, 224, 128], [224, 224, 128], [ 32, 32, 64], [160, 32, 64], [ 32, 160, 64], [160, 160, 64], [ 32, 32, 192], [160, 32, 192], [ 32, 160, 192], [160, 160, 192], [ 96, 32, 64], [224, 32, 64], [ 96, 160, 64], [224, 160, 64], [ 96, 32, 192], [224, 32, 192], [ 96, 160, 192], [224, 160, 192], [ 32, 96, 64], [160, 96, 64], [ 32, 224, 64], [160, 224, 64], [ 32, 96, 192], [160, 96, 192], [ 32, 224, 192], [160, 224, 192], [ 96, 96, 64], [224, 96, 64], [ 96, 224, 64], [224, 224, 64], [ 96, 96, 192], [224, 96, 192], [ 96, 224, 192], [224, 224, 192]], dtype=uint8) 这几个加粗的值就是上面unique_value的值就是下面的索引。 所以0 --> [ 0, 0, 0]; 5-->[128, 0, 128]; 11-->[192, 128, 0]; 255->[224, 224, 192] 如果不想知道一一对应,只是想知道有哪些颜色,可以使用如下代码 # Convert Image to RGB and make into Numpy array na = np.array(im.convert('RGB')) # Get used colours and counts of each colours, counts = np.unique(na.reshape(-1,3), axis=0, return_counts=1) 如何将灰度图像保存为P模式的图像呢? from PIL import Image import numpy as np import os def label_colormap(N=256): def bitget(byteval, idx): return ((byteval & (1 |
CopyRight 2018-2019 实验室设备网 版权所有 |